package com.dbpediamobile;

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;


/*
 * Autor: Camilo Verdugo
 * Metodo que hace un llamado remoto al endpoint con la consulta, dada un texto.
 * Retorna los resultados formateados, tal que cada objeto indica: Url, nombre y coordenadas
 */
public class MapaConexion extends Thread {

	public String query;
	private URL dir;
	private URLConnection yc;
	private BufferedReader in;
	
	@Override
    public void run(){}
	
	 
	/*
	 * Metodo que realiza la busqueda HTML de un lugar.
	 * Obtiene un documento y lo parsea.
	 */
	public ArrayList <MapaResult> buscar() throws IOException{
		
		String u = "http://dbpedia.org/sparql?default-graph-uri=http://dbpedia.org&should-sponge=&query="+query+"&format=XML&debug=off&timeout=500";
		
		dir = new URL(u);
		yc = dir.openConnection();
		in = new BufferedReader(new InputStreamReader(yc.getInputStream()));
		yc.setConnectTimeout(500);
		String inputLine;
	    String salida = "";
	    while ((inputLine = in.readLine()) != null){
	    	salida += inputLine;	
	    }	      
	    in.close();
	    return this.Document2String(this.string2Document(salida)); 
	      
	    
	}
    
	
	//Metodo de parseo de string a documents
    public Document string2Document(String s)
	{ 
		Document tmpX=null; 
	    DocumentBuilder builder = null; 
	    int coderror;
		String msgerror;
		try{ 
	        builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); 
	    }catch(javax.xml.parsers.ParserConfigurationException error){ 
	        coderror=10; 
	        msgerror="Error crando factory String2DOM "+error.getMessage(); 
	        return null; 
	    } 
	    try{ 
	        tmpX=builder.parse(new ByteArrayInputStream(s.getBytes())); 
	    }catch(org.xml.sax.SAXException error){ 
	        coderror=10; 
	        msgerror="Error parseo SAX String2DOM "+error.getMessage(); 
	        return null; 
	    }catch(IOException error){ 
	        coderror=10; 
	        msgerror="Error generando Bytes String2DOM "+error.getMessage(); 
	        return null; 
	    } 
	    return tmpX; 
	} 
	
	/*
	 * Lee el XML obtenido y lo parsea al arreglo para luego ser retornado por el metodo "buscar()"
	 */
	private ArrayList <MapaResult> Document2String(Document doc){
		
		NodeList listOfPersons = doc.getElementsByTagName("result");
		int totalPersons = listOfPersons.getLength();
		
		ArrayList <MapaResult> resultados = new ArrayList();
		
		String nodos = "";
		for(int s=0; s<listOfPersons.getLength() ; s++){

			Node firstPersonNode = listOfPersons.item(s);
			if(firstPersonNode.getNodeType() == Node.ELEMENT_NODE){
				Element firstPersonElement = (Element)firstPersonNode; 
				
				NodeList firstNameList = firstPersonElement.getElementsByTagName("uri");
				Element firstNameElement = (Element)firstNameList.item(0);		
				NodeList textFNList = firstNameElement.getChildNodes();
				
				NodeList firstNameList2 = firstPersonElement.getElementsByTagName("literal");
				Element firstNameElement2 = (Element)firstNameList2.item(0);		
				NodeList textFNList2 = firstNameElement2.getChildNodes();
				
				NodeList firstNameList3 = firstPersonElement.getElementsByTagName("literal");
				Element firstNameElement3 = (Element)firstNameList3.item(1);		
				NodeList textFNList3 = firstNameElement3.getChildNodes();
				
				
				
				MapaResult mr = new MapaResult();
				
				mr.lat = ((Node)textFNList2.item(0)).getNodeValue().trim();	
				mr.lon = ((Node)textFNList3.item(0)).getNodeValue().trim();	
				mr.url = ((Node)textFNList.item(0)).getNodeValue().trim();	
				String nombre = TextFormater.formatText(((Node)textFNList.item(0)).getNodeValue().trim().replace("http://dbpedia.org/resource/", "").replace("_", " "));
				
				mr.nombre = TextFormater.formatLink(nombre);
					
				Boolean b = false;
				//Comprueba que no existan resultados repetidos por el nombre
				for(int i=0;i<resultados.size();i++){
					if(resultados.get(i).nombre.equals(mr.nombre)){
						b = true;
						break;
					}
				}
				if(b==false){
					resultados.add(mr);
				}
				
			}
		}
		return resultados;


	}
    
}
